<!doctype html><html lang=cn-zh><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta http-equiv=X-UA-Compatible content="IE=edge"><style type=text/css>body{font-family:monospace}</style><title>Web|关于cookie和session一点知识</title>
<meta name=description content="A blog maintained by Vimiix."><link rel=stylesheet href=/css/style.css><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?7c24231917964240bae97e813810620c",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script></head><body><header>====================<br>== Hi, I'm Vimiix ==<br>====================<div style=float:right;color:gray;font-size:x-large>Get hands dirty.</div><br><p><nav><a href=https://www.vimiix.com/><b>首页</b></a>.
<a href=/posts/><b>文章列表</b></a>.
<a href=/projects/><b>开源项目</b></a>.
<a href=/tags/><b>标签</b></a>.
<a href=/friends/><b>友链</b></a>.
<a href=/about/><b>关于我</b></a>.
<a href=/index.xml><b>RSS</b></a>.</nav></p></header><main><article><h1>Web|关于cookie和session一点知识</h1><b><time>2017.06.22 16:03</time></b>
<a href=/tags/python>Python</a>
<a href=/tags/django>Django</a>
<a href=/tags/cookie>cookie</a>
<a href=/tags/session>session</a><div><h3 id=cookie维基百科定义httpszhwikipediaorgwikicookie>cookie(<a href=https://zh.wikipedia.org/wiki/Cookie>维基百科定义</a>)</h3><blockquote><p>Cookie（复数形态 Cookies），中文名称为“小型文本文件”或“小甜饼”[1]，指某些网站为了辨别用户身份而储存在用户本地终端（Client Side）上的数据（通常经过加密）。</p></blockquote><h3 id=cookie-机制>cookie 机制</h3><p>cookie 机制采用的是在客户端保持状态的方案。</p><p>cookie 机制，就是当服务器对访问它的用户生成了一个 session 的同时服务器通过在 HTTP 的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的 cookie，保存在客户端，里面记录着用户当前的信息，当用户再次访问服务器时，浏览器检查所有存储的 cookie，如果某个 cookie 所声明的作用范围大于等于将要请求的资源所在的位置也就是对应的 Cookie 文件,若存在，则把该 cookie 附在请求资源的 HTTP 请求头上发送给服务器。</p><p>cookie 的内容主要包括：名字，值，过期时间，路径和域。</p><p>前三个内容比较好理解，不作叙述。</p><p>路径就是跟在域名后面的 URL 路径，比如<code>/</code>或者<code>/foo</code>等等，路径与域合在一起就构成了 cookie 的作用范围。</p><h6 id=cookie-生命周期>cookie 生命周期</h6><p>如果不设置过期时间，则表示这个 cookie 的生命期为浏览器会话期间，只要关闭浏览器窗口，cookie 就消失了。这种生命期为浏览器会话期的 cookie 被称为会话 cookie。会话 cookie 一般不存储在硬盘上而是保存在内存里，当然这种行为并不是规范规定的。</p><p>如果设置了过期时间，浏览器就会把 cookie 保存到硬盘上，关闭后再次打开浏览器，这些 cookie 仍然有效直到超过设定的过期时间。</p><blockquote><p>Session 直接翻译成中文比较困难，一般都译成时域。在计算机专业术语中，Session 是指一个终端用户与交互系统进行通信的时间间隔，通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话，可能还有一定的操作空间。</p></blockquote><h3 id=session-机制>session 机制</h3><p>Session 机制采用的是在服务器端保持状态的方案。</p><p>当用户访问到一个服务器，服务器就要为该用户创建一个 SESSION，在创建这个 SESSION 的时候，服务器首先检查这个用户发来的请求里是否包含了一个 SESSIONID，如果包含了一个 SESSIONID 则说明之前该用户已经登陆过并为此用户创建过 SESSION，那服务器就按照这个 SESSIONID 把这个 SESSION 在服务器的内存中查找出来（如果查找不到，就有可能为他新创建一个），如果客户端请求里不包含有 SESSIONID，则为该客户端创建一个 SESSION 并生成一个与此 SESSION 相关的 SESSIONID。这个 SESSIONID 是唯一的、不重复的、不容易找到规律的字符串，这个 SESSIONID 将被在本次响应中返回到客户端保存，而保存这个 SESSIONID 的正是 COOKIE，这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。</p><h3 id=request-请求流程中的-cookie-和-session>Request 请求流程中的 cookie 和 session</h3><p><figure><img src=http://vimiix-blog.oss-cn-qingdao.aliyuncs.com/cookie-session-1.png alt></figure></p><h3 id=request-结束之后的流程>Request 结束之后的流程</h3><p><figure><img src=http://vimiix-blog.oss-cn-qingdao.aliyuncs.com/cookie-session-2.png alt></figure></p><h3 id=django-中操作-cookie-和-session>Django 中操作 cookie 和 session</h3><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Python data-lang=Python><span style=display:flex><span>
</span></span><span style=display:flex><span>	<span style=color:#75715e>#设置cookie</span>
</span></span><span style=display:flex><span>	response<span style=color:#f92672>.</span>set_cookie(<span style=color:#e6db74>&#34;cookie_Key&#34;</span>, <span style=color:#e6db74>&#34;value&#34;</span>, max_age)
</span></span><span style=display:flex><span>	<span style=color:#75715e>#获取cookie</span>
</span></span><span style=display:flex><span>	value <span style=color:#f92672>=</span> request<span style=color:#f92672>.</span>COOKIES[<span style=color:#e6db74>&#34;cookie_Key&#34;</span>]
</span></span><span style=display:flex><span>	<span style=color:#75715e>#删除cookie</span>
</span></span><span style=display:flex><span>	response<span style=color:#f92672>.</span>delete_cookie(<span style=color:#e6db74>&#34;cookie_Key&#34;</span>, path<span style=color:#f92672>=</span><span style=color:#e6db74>&#34;/&#34;</span>, domain<span style=color:#f92672>=</span>name)
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>	<span style=color:#75715e>#设置session</span>
</span></span><span style=display:flex><span>	request<span style=color:#f92672>.</span>session[<span style=color:#e6db74>&#34;session_name&#34;</span>] <span style=color:#f92672>=</span> <span style=color:#e6db74>&#34;admin&#34;</span>
</span></span><span style=display:flex><span>	<span style=color:#75715e>#获取session</span>
</span></span><span style=display:flex><span>	session_name <span style=color:#f92672>=</span> request<span style=color:#f92672>.</span>session[<span style=color:#e6db74>&#34;session_name&#34;</span>]
</span></span><span style=display:flex><span>	<span style=color:#75715e>#删除session</span>
</span></span><span style=display:flex><span>	<span style=color:#66d9ef>del</span> request<span style=color:#f92672>.</span>session[<span style=color:#e6db74>&#34;session_name&#34;</span>]
</span></span></code></pre></div><h5 id=设置-cookie-可传递的可选参数描述参考自网络>设置 cookie 可传递的可选参数描述：（参考自网络）</h5><table><thead><tr><th style=text-align:left>参数</th><th style=text-align:left>缺省值</th><th style=text-align:left>描述</th></tr></thead><tbody><tr><td style=text-align:left>max_age</td><td style=text-align:left>None</td><td style=text-align:left>cookies 的持续有效时间（以秒计），如果设置为 None cookies 在浏览器关闭的时候就失效了</td></tr><tr><td style=text-align:left>expires</td><td style=text-align:left>None</td><td style=text-align:left>cookies 的过期时间，格式： &ldquo;Wdy, DD-Mth-YY HH:MM:SS GMT&rdquo; 如果设置这个参数，它将覆盖 max_age 参数。</td></tr><tr><td style=text-align:left>path</td><td style=text-align:left>&ldquo;/&rdquo;</td><td style=text-align:left>cookie 生效的路径前缀，浏览器只会把 cookie 回传给带有该路径的页面，这样你可以避免将 cookie 传给站点中的其他的应用。当你的应用不处于站点顶层的时候，这个参数会非常有用。</td></tr><tr><td style=text-align:left>domain</td><td style=text-align:left>None</td><td style=text-align:left>cookie 生效的站点。你可用这个参数来构造一个跨站 cookie。如,domain=".example.com"所构造的 cookie 对下面这些站点都是可读的： <a href=https://www.example.com>www.example.com</a> 、www2.example.com 和 an.other.sub.domain.example.com 。如果该参数设置为 None ，cookie 只能由设置它的站点读取。</td></tr><tr><td style=text-align:left>secure</td><td style=text-align:left>False</td><td style=text-align:left>如果设置为 True ，浏览器将通过 HTTPS 来回传 cookie。</td></tr></tbody></table></div></article></main><aside><div><div><h3>LATEST POSTS</h3></div><div><ul><li><a href=/posts/2025-10-16-kubernetes-apiserver-authorization-mechanism/>Kubernetes APIServer 鉴权机制</a></li><li><a href=/posts/2025-09-30-kubernetes-apiserver-authentication-mechanism/>Kubernetes APIServer 认证机制</a></li><li><a href=/posts/2024-12-16-deploy-kubernetes-by-kubeadm/>使用 kubeadm 搭建 kubernetes 集群</a></li><li><a href=/posts/2024-09-20-how-to-code-review/>如何做code review</a></li><li><a href=/posts/2024-08-12-weakref-in-python/>Python中的弱引用</a></li></ul></div></div></aside><footer><p>Social Links:
<a href=https://github.com/vimiix><b>Github</b></a>.
<a href=https://www.douban.com/people/vimiix/><b>Douban</b></a>.
<a href=mailto:i@vimiix.com><b>Email</b></a>.<br><hr>&copy; 2017-2025
Vimiix Yao; All rights reserved.
<a href=https://beian.miit.gov.cn/>京ICP备19015214号-1</a></p><script src=https://l2dwidget.js.org/lib/L2Dwidget.min.js></script><script>L2Dwidget.init({model:{jsonPath:"https://unpkg.com/live2d-widget-model-tororo@1.0.5/assets/tororo.model.json"}})</script></footer></body></html>